import {TableDataType} from "../../sqlbuilder";

/**
 * 数据库配置接口
 */
export interface DbConfig {
  /**
   * 数据库文件路径
   */
  dbPath: string;

  /**
   * 数据库名称，可选，用于多数据库管理，默认default
   */
  name?: string;

  /**
   * Better-sqlite3选项
   */
  sqliteOptions?: any;

  /**
   * 是否启用WAL模式（默认：true）
   */
  enableWAL?: boolean;

  /**
   * 是否启用外键约束（默认：true）
   */
  enableForeignKeys?: boolean;

  /**
   * 是否启用加密（需要安装better-sqlite3-multiple-ciphers，默认：false）
   */
  enableEncryption?: boolean;

  /**
   * 数据库密码，当enableEncryption=true时使用
   */
  password?: string;

  /**
   * 主键生成配置
   */
  primaryKeyConfig?: PrimaryKeyConfig;

  /**
   * 逻辑删除配置
   */
  logicalDelete?: LogicalDeleteConfig;

  /**
   * 数据表数据类型检查等级，默认强类型
   */
  tableDataTypeCheckLevel?: TableDataTypeCheckLevel;

  /**
   * 启用debug模式，对执行的sql进行打印
   */
  debug?: boolean;
}


/**
 * 主键生成配置
 */
export interface PrimaryKeyConfig {
  /**
   * 主键字段名
   */
  fieldName: string;

  /**
   * 是否自动生成ID主键（默认：true）
   */
  autoGenerateId?: boolean;

  /**
   * ID生成策略（默认：AUTO_INCREMENT）
   */
  idGenerationStrategy?: IdGenerationStrategyType;

  /**
   * 雪花算法的节点ID（仅当idGenerationStrategy为SNOWFLAKE时使用）
   */
  snowflakeNodeId?: number;
}

/**
 * 逻辑删除配置
 */
export interface LogicalDeleteConfig {
  /**
   * 逻辑删除字段名
   */
  fieldName: string;

  /**
   * 标记为已删除的值，支持函数
   */
  deletedValue: any | (() => any);

  /**
   * 标记为未删除的值，支持函数
   */
  notDeletedValue: any | (() => any);
}

/**
 * ID生成策略枚举
 */
export type IdGenerationStrategy = 'AUTO_INCREMENT' | 'SNOWFLAKE' | 'UUID';

/**
 * 数据表数据类型检查等级
 * - STRICT: 执行SQL前会严格校验值与字段类型是否匹配，不匹配则抛出异常
 * - AUTO_ADAPT: 执行SQL前会尝试自动转换，转换失败则抛出异常
 * - NONE: 不对传入参数值与实体类字段类型校验，直接给数据库执行
 */
export type TableDataTypeCheckLevel = 'STRICT' | 'AUTO_ADAPT' | 'NONE';

/**
 * 自定义ID生成策略
 */
export interface IdGenerationCustomStrategy {
  /**
   * 生成一个唯一ID
   */
  generate: () => string | number;

  /**
   * 字段类型
   */
  fieldType: () => TableDataType;
}

/**
 * 主键生成策略类型
 */
export type IdGenerationStrategyType = IdGenerationStrategy | IdGenerationCustomStrategy;

/**
 * 全局填充器接口
 */
export interface EntityFiller {
  /**
   * 插入时填充字段值
   * @param entity 实体对象
   * @param field 字段名
   * @returns 填充的值
   */
  fillInsert: (entity: any, field: string) => any;

  /**
   * 更新时填充字段值
   * @param entity 实体对象
   * @param field 字段名
   * @returns 填充的值
   */
  fillUpdate: (entity: any, field: string) => any;
}

/**
 * 字段填充类型
 */
export type FieldFillType = 'INSERT' | 'UPDATE' | 'INSERT_UPDATE' | EntityFiller;
